#ifndef XVIDEOTHREAD_H
#define XVIDEOTHREAD_H

#include <QThread>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

#include <QMutex>
#include <iostream>
using namespace std;

class XVideoThread : public QThread
{
    Q_OBJECT
public:
    //单例模式
    static XVideoThread* getInstance() {
        static XVideoThread vt;
        return &vt;
    }

    ~XVideoThread();

    //打开一号视频源文件
    bool open(const string filePath);

    //打开二号视频源文件（视频融合时）
    bool open2(const string filePath);

    //线程入口函数
    void run();

    //返回当前播放的位置
    double getPos();

    //根据frame帧位置，跳转视频
    bool seek(int frame);
    //根据滑动条位置，确定frame
    bool seek(double pos);

    //开始保存视频
    bool startSave(const std::string filePath, int width = 0, int height = 0, bool isColor = true);

    //停止保存视频，写入视频帧的索引
    void stopSave();

    //播放
    void play();
    //暂停
    void pause();

    //设置水印
    void setMark(cv::Mat mark);

    //剪辑视频设置位置（pos为百分比的值）
    void setBegin(double pos);
    void setEnd(double pos);

public:
    bool isExit = false; //是否退出
    int fps = 0;
    int width = 0;
    int height = 0;
    bool isPlay = false; //播放状态
    int width2 = 0;
    int height2 = 0;

    int beginPos = 0; //起始帧的位置
    int endPos = 0;   //结束帧的位置

    std::string src1File; //原视频路径
    std::string desFile;  //输出视频路径

    int totalMs; //总时长

signals:
    //显示视频1图像
    void sigViewImage1(cv::Mat mat);
    //显示视频2图像（视频融合时）
    void sigViewImage2(cv::Mat mat);
    //显示输出视频图像
    void sigViewDes(cv::Mat mat);
    //保存结束
    void sigSaveEnd();

private:
    explicit XVideoThread(QObject *parent = nullptr);
    QMutex mutex;
    //是否开始写视频
    bool isWrite = false;

    cv::Mat mark; //水印
};

#endif // XVIDEOTHREAD_H
